"""
Набор разнобразных развлекательных команд.

- кубик, случайное число, случайный выбор, монетка, шанс, успех.
- unixtime, +время, uni2time.
- очистить текст, развернуть текст, перевернуть текст.
- случайный смайлик, генератор кода, скушать случайный предмет, bin2num,
- попытка

Author: Milinuri Nirvalen
Ver: 1.3.6 (12)
"""

from chiori import Config
from chiori import Plugin
from libs.utils import parse_timedelta
from libs.utils import binToNum
from libs.utils import clear_text
from libs.utils import gen_code

import random
import time


p = Plugin(name='развлечения', desc='набор развлекательных команд')

# commands
# ========

@p.command('cube', 'кубик', 'dice', usage='[iterations] подбросить кубик')
async def dice(event, ctx):
	i = 1
	if ctx.sargs.isdigit():
		i = int(ctx.sargs)
	if i > 1000:
		i = 1000

	resuilts = []
	for x in range(i):
		resuilts.append(random.randrange(1, 6))

	await ctx.message(f'🎲: выпало {sum(resuilts)} [{resuilts}]')


@p.command('число', 'r', 'random', 'int',
	usage='[мнимум] [максимум] получить случайное число')
async def randRange(event, ctx):
	if ctx.args:
		if len(ctx.args) == 2:
			count = random.randrange(int(ctx.args[0]), int(ctx.args[1]))
		else:
			count = random.randrange(1, int(ctx.args[0]))

		await ctx.message(f'🎲: {count}')
	else:
		await ctx.message('🎲: вы не указали число...')


@p.command('выбери', usage='[A или Б] случайно выбрать между вариантами')
async def choice(event, ctx):
	variants = ctx.sargs.split(' или ')
	answers = ['я выбираю ', 'думаю будет лучше ', 'наверное ', ' ']
	await ctx.message(f'<c> {random.choice(answers)}{random.choice(variants)}')


@p.command('монетка', 'coin', usage='[val] подбросить монетку')
async def coinFlip(event, ctx):

	target = random.choice(['орёл', 'решка'])
	phrases = ['Хопа, (с)!', 'Опля, (с) ^^!', 'На этот раз выпал(а) (с).',
			   'Тута написано... (с).', 'Выпал(а) (с).', 'Упала... (с)!',
			   'Вижу (с) летит^^.']

	phrase = random.choice(phrases)
	if target == 'решка':
		phrase = phrase.replace('(а)', 'а')
	else:
		phrase = phrase.replace('(а)', '')

	phrase = phrase.replace('(с)', target)

	if ctx.args and ctx.args[0].startswith(target[0]):
		win_phrases = ['Угадали!', 'Повезло!', 'Уря, вы угадали!']
		phrase += '\n'+random.choice(win_phrases)

	await ctx.message(phrase)


@p.command('unixtime', usage='получить кол-во секунд с 01.01.1970')
async def getUnixtime(event, ctx):
	await ctx.message(ctx.now)


@p.command('вероятность', 'шанс', 'chance',
	usage='[text] случайная вероятность события.')
async def randomChance(event, ctx):
	if ctx.sargs:
		await ctx.message(f'вероятность этого - {random.randrange(100)}%')
	else:
		await ctx.message(f'вероятность чего?')


@p.command('win', 'pr', 'доля', 'успех',
	usage='[удачных, всего] узнвть вероятность успеха')
async def getWinChance(event, ctx):
	if ctx.args:
		win = 1
		lose = 6

		if len(ctx.args) >= 2:
			if ctx.args[0].isdigit():
				win = int(ctx.args[0])
			if ctx.args[1].isdigit():
				lose = int(ctx.args[1])

		elif len(ctx.args) == 1 and ctx.args[0].isdigit():
			lose = int(ctx.args[0])


		await ctx.message(f'[{win}/{lose}] вероятность успеха - {round(100/lose*win), 2}%')

	else:
		await ctx.message('укажите аргументы.')


@p.command('addtime', '+время',  usage='[date] добавить время')
async def addTime(event, ctx):
	seconds = parse_timedelta(ctx.sargs)

	text = f'''
сейчас: {ctx.strtime}
будет: (+{seconds} сек.) {time.ctime(ctx.now + seconds)}'''
	await ctx.message(text)


@p.command('time', 'uni2time', usage='[unixtime] unixtime -> datetime')
async def unixtimeToDatetime(event, ctx):
	if ctx.sargs.isdigit():
		await ctx.message(f'{ctx.sargs} -> {time.ctime(int(ctx.sargs))}')
	else:
		await ctx.message('пожалуйста укажите кол-во секунд')


@p.command('очистить', 'ctext', usage='[text] очистить текст')
async def clearText(event, ctx):
	await ctx.message(f"{clear_text(event.get('reply.text', ctx.sargs))}")


@p.command('reverse', 'разверни', 'развернуть',
	usage='[text] развернуть текст')
async def reverseText(event, ctx):
	await ctx.message(f'{ctx.sargs[::-1]}')

rt = {
	'q': 'q',
	'w': 'ʍ',
	'e': 'ǝ',
	'r': 'ɹ',
	't': 'ʇ',
	'y': 'ʎ',
	'u': 'u',
	'i': 'ᴉ',
	'o': 'o',
	'p': 'p',
	'a': 'ɐ',
	's': 's',
	'd': 'd',
	'f': 'ɟ',
	'g': 'ƃ',
	'h': 'ɥ',
	'j': 'ɾ',
	'k': 'ʞ',
	'l': 'l',
	'z': 'z',
	'x': 'x',
	'c': 'ɔ',
	'v': 'ʌ',
	'b': 'b',
	'n': 'n',
	'm': 'ɯ',

	'й': 'ņ',
	'ц': 'ǹ',
	'у': 'ʎ',
	'к': 'ʞ',
	'е': 'ǝ',
	'н': 'н',
	'г': 'ɹ',
	'ш': 'm',
	'щ': 'm',
	'з': 'ε',
	'х': 'х',
	'ъ': 'q',
	'ф': 'ф',
	'ы': 'ıq',
	'в': 'ʚ',
	'а': 'ɐ',
	'п': 'u',
	'р': 'd',
	'о': 'о',
	'л': 'v',
	'д': 'ɓ',
	'ж': 'ж',
	'э': 'є',
	'я': 'ʁ',
	'ч': 'һ',
	'с': 'ɔ',
	'м': 'w',
	'и': 'и',
	'т': 'ɯ',
	'ь': 'q',
	'б': 'ƍ',
	'ю': 'oı',

}


@p.command('rotate', 'перевернуть', usage='[text] перевернуть текст текст')
async def rotateText(event, ctx):
	resp = ''
	for x in ctx.sargs[::-1].lower():
		if x in rt:
			resp += rt[x]
		else:
			resp += x
	await ctx.message(f'{resp}')


@p.command('emoji', 'smile', 'эмодзи', 'смайл', 'смайлик', '',
	usage='выдать случайный смайлик')
async def semdEmoji(event, ctx):
	emojis = ['😀', '😃', '😄', '😁', '😅', '😆', '😂', '🤣', '😉', '☺', '🙂',
          '😇', '😗', '😙', '😚', '🤗', '😋', '😜', '🤪', '😝', '🤑', '🤭', '🤐', '🤫',
          '😶', '🤔', '🤨', '🧐', '🙄', '😏', '😌', '🤤', '😴', '🤓', '😎', '🥳', '🤠',
          '😳', '🥺', '😈', '🤧', '🥶', '🥵', '😸', '😹', '😼', '😽', '🙀', '😿', '😾']
	await ctx.message(random.choice(emojis))


@p.command('code', 'код', usage='[range] сгененрировать код (0-9)')
async def genCode(event, ctx):
	i = 6
	if ctx.sargs.isdigit():
		i = int(ctx.sargs)

	await ctx.message(f'<c> {gen_code(i)}')


@p.command('кушать', usage='скушать случайный предмет')
async def eat(event, ctx):
	eatable = Config("eat", ["🍎 Яблочко"]	).group_data

	if ctx.sargs in ['list', 'список']:
		text = f'всего вариантов: {len(eatable)}'
	else:
		text = f'вы скушали: {random.choice(eatable)}'

	await ctx.message(text)


@p.command('bin', usage='[num] bin <-> int')
async def binConventer(event, ctx):
	if ctx.sargs and ctx.sargs[0] == 'b':
		num = binToNum(ctx.sargs[1:])
		await ctx.message(f'2 -> 10: {num}')
	elif ctx.sargs.isdigit():
		num = bin(int(ctx.sargs))[2:]
		await ctx.message(f'10 -> 2: {num}')
	else:
		await ctx.message(f'пример:\n2>10: b10; b101...\n10>2: 2; 3; 4...')


@p.command('попытка', 'попытаться', usage='[text] испытать удачу')
async def attempt(event, ctx):
	r = random.randrange(2)

	if r == 1:
		a = 'удачно'
	else:
		a = 'неудачно'

	await ctx.message(f'{ctx.sargs} | {a}')
